spクラス

地理空間データ分析(共立出版) の 付録BとDを参考に,spクラスデータの作成と操作についてまとめる.

Rで空間データを扱うための基盤となるspパッケージで用いられるGISデータのクラス.

地点データのSpatialPoints, 線分データのSpatialLines, ポリゴンデータのSpatialPolygons など.

SpatialPointsクラス

地点データを扱うクラスであり,地点の座標,境界を表すbbox,投影?座標系情報のproj4stringからなる.SpatialPointsに属性のデータフレームを追加したのがSpatialPointsDataFRameクラス.

library(sp)
lon <- c(135.7917,135.8167,135.8528,135.7639,135.8639,135.8056,135.8667,135.8583,135.8639,135.9361,135.7833)
lat <- c(35.11111,35.14722,35.10833,35.10000,35.11944,35.02500,35.06667,35.10278,34.95556,35.02500,35.00000)
lonlat <- cbind(lon,lat) # 地点データ
pj <- CRS("+proj=longlat +datum=WGS84") # 投影?座標系情報
sp <- SpatialPoints(lonlat, proj4string=pj) # SpatialPointsの作成
d <- data.frame(id=as.factor(1:length(sp))) # 属性データ
spd <- SpatialPointsDataFrame(sp,data=d) # SpatialPointsDataFrameの作成
spd@coords # 地点データ
##         lon   lat
##  [1,] 135.8 35.11
##  [2,] 135.8 35.15
##  [3,] 135.9 35.11
##  [4,] 135.8 35.10
##  [5,] 135.9 35.12
##  [6,] 135.8 35.02
##  [7,] 135.9 35.07
##  [8,] 135.9 35.10
##  [9,] 135.9 34.96
## [10,] 135.9 35.02
## [11,] 135.8 35.00
spd@bbox # 境界
##        min    max
## lon 135.76 135.94
## lat  34.96  35.15
spd@proj4string # 投影?座標系情報
## CRS arguments: +proj=longlat +datum=WGS84
spd@data # 属性データ
##    id
## 1   1
## 2   2
## 3   3
## 4   4
## 5   5
## 6   6
## 7   7
## 8   8
## 9   9
## 10 10
## 11 11
spplot(spd,key.space="right")

plot of chunk unnamed-chunk-2

SpatialLinesクラス

線分を定義するLineクラスであり,Line()で作成される.複数のLineクラスデータにIDを情報を付与してまとめたのがLinesクラスである.Linesクラスの集合にbboxproj4stringを付与したのがSpatialLinesクラスである.SpatialLinesに属性のデータフレームを追加したのがSpatialLinesDataFrameクラスである.

# 経由地点データ
L1 <- matrix(c(135.76,35.1,135.79,35.11,135.86,35.12,135.94,35.02), ncol=2, byrow=TRUE)
L2 <- matrix(c(135.86,35.12,135.85,35.11,135.86,35.1,135.87,35.07), ncol=2, byrow=TRUE)
L3 <- matrix(c(135.82,35.15,135.86,34.96,135.78,35,135.81,35.02), ncol=2, byrow=TRUE)
# Lineクラスへ変換
L1.l <- Line(L1); L2.l <- Line(L2); L3.l <- Line(L3);
# LinesクラスでまとめてID付与
L1.ls <- Lines(list(L1.l,L2.l),ID="1")
L3.ls <- Lines(list(L3.l),ID="3")
# SpatialLinesの作成
pj <- CRS("+proj=longlat +datum=WGS84") # 投影?座標系情報
sl <- SpatialLines(list(L1.ls,L3.ls),proj4string=pj)
# 属性データの追加(SpatialLinesのID = 属性データフレームの行名)
d <- data.frame(width=factor(c(5,10)), row.names=c(1,3))
sld <- SpatialLinesDataFrame(sl,data=d)
sld@lines # 線分データ
## [[1]]
## An object of class "Lines"
## Slot "Lines":
## [[1]]
## An object of class "Line"
## Slot "coords":
##       [,1]  [,2]
## [1,] 135.8 35.10
## [2,] 135.8 35.11
## [3,] 135.9 35.12
## [4,] 135.9 35.02
## 
## 
## [[2]]
## An object of class "Line"
## Slot "coords":
##       [,1]  [,2]
## [1,] 135.9 35.12
## [2,] 135.8 35.11
## [3,] 135.9 35.10
## [4,] 135.9 35.07
## 
## 
## 
## Slot "ID":
## [1] "1"
## 
## 
## [[2]]
## An object of class "Lines"
## Slot "Lines":
## [[1]]
## An object of class "Line"
## Slot "coords":
##       [,1]  [,2]
## [1,] 135.8 35.15
## [2,] 135.9 34.96
## [3,] 135.8 35.00
## [4,] 135.8 35.02
## 
## 
## 
## Slot "ID":
## [1] "3"
spplot(sld,zcol="width")

plot of chunk unnamed-chunk-4

SpatialPolygonsクラス

始点と終点が同じ点である点データからなる多角形はPloygon()Polygonクラスが定義される.湖や沼のような穴である場合はhole=TRUEとしてホール属性を付与する必要がある.複数のPloygonクラスデータにIDを情報を付与してまとめたのがPolygonsクラスである.Polygonsクラスの集合にbboxproj4stringを付与したのがSpatialPolygonsクラスである.SpatialPolygonsに属性のデータフレームを追加したのがSpatialPolygonsDataFrameクラスである.

# 頂点データ
p1 <- matrix(c(1,2.4,1.7,3.1,2.4,2.4,1.7,1.7,1,2.4), byrow=TRUE, ncol=2)
p2 <- matrix(c(0.8,2,1,2,0.9,1.5,0.8,2), byrow=TRUE, ncol=2)
p3 <- matrix(c(-0.2,1.7,1,2.4,1.7,1.7,1,1,-0.2,1.7), byrow=TRUE, ncol=2)
p4 <- matrix(c(1,-0.3,2,-0.3,2,1,1.7,1.7,1,1,1,-0.3), byrow=TRUE, ncol=2)
# Polygonクラスへ変換
P1 <- Polygon(p1)
P2 <- Polygon(p2, hole=TRUE)
P3 <- Polygon(p3)
P4 <- Polygon(p4)
# PolygonsクラスでまとめてID付与
P1s <- Polygons(list(P1), ID="1")
P2s <- Polygons(list(P2, P3), ID="3")
P3s <- Polygons(list(P4), ID="4")
# SpatialPolygonsの作成
sp <- SpatialPolygons(list(P1s, P2s, P3s))
# 属性データ追加
d <- data.frame(name=c("A","B","C"), row.names=c(1,3,4))
spd <- SpatialPolygonsDataFrame(sp, data=d)
spd@polygons # ポリゴンデータ
## [[1]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 1.7 2.4
## 
## Slot "area":
## [1] 0.98
## 
## Slot "hole":
## [1] FALSE
## 
## Slot "ringDir":
## [1] 1
## 
## Slot "coords":
##      [,1] [,2]
## [1,]  1.0  2.4
## [2,]  1.7  3.1
## [3,]  2.4  2.4
## [4,]  1.7  1.7
## [5,]  1.0  2.4
## 
## 
## 
## Slot "plotOrder":
## [1] 1
## 
## Slot "labpt":
## [1] 1.7 2.4
## 
## Slot "ID":
## [1] "1"
## 
## Slot "area":
## [1] 0.98
## 
## 
## [[2]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 0.900 1.833
## 
## Slot "area":
## [1] 0.05
## 
## Slot "hole":
## [1] TRUE
## 
## Slot "ringDir":
## [1] -1
## 
## Slot "coords":
##      [,1] [,2]
## [1,]  0.8  2.0
## [2,]  0.9  1.5
## [3,]  1.0  2.0
## [4,]  0.8  2.0
## 
## 
## [[2]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 0.8333 1.7000
## 
## Slot "area":
## [1] 1.33
## 
## Slot "hole":
## [1] FALSE
## 
## Slot "ringDir":
## [1] 1
## 
## Slot "coords":
##      [,1] [,2]
## [1,] -0.2  1.7
## [2,]  1.0  2.4
## [3,]  1.7  1.7
## [4,]  1.0  1.0
## [5,] -0.2  1.7
## 
## 
## 
## Slot "plotOrder":
## [1] 2 1
## 
## Slot "labpt":
## [1] 0.8333 1.7000
## 
## Slot "ID":
## [1] "3"
## 
## Slot "area":
## [1] 1.33
## 
## 
## [[3]]
## An object of class "Polygons"
## Slot "Polygons":
## [[1]]
## An object of class "Polygon"
## Slot "labpt":
## [1] 1.5141 0.5374
## 
## Slot "area":
## [1] 1.65
## 
## Slot "hole":
## [1] FALSE
## 
## Slot "ringDir":
## [1] 1
## 
## Slot "coords":
##      [,1] [,2]
## [1,]  1.0 -0.3
## [2,]  1.0  1.0
## [3,]  1.7  1.7
## [4,]  2.0  1.0
## [5,]  2.0 -0.3
## [6,]  1.0 -0.3
## 
## 
## 
## Slot "plotOrder":
## [1] 1
## 
## Slot "labpt":
## [1] 1.5141 0.5374
## 
## Slot "ID":
## [1] "4"
## 
## Slot "area":
## [1] 1.65
spplot(spd,zcol="name")

plot of chunk unnamed-chunk-6

SpatialPolygonsSpatialPolygonsDataFrameのポリゴンを任意のグループのポリゴンに分解するには

spd1 <- spd[1:2,]
spd2 <- spd[3,]
par(mfrow=c(1,2))
plot(spd1)
plot(spd2)

plot of chunk unnamed-chunk-7

ポリゴンを結合するには,maptoolsパッケージのunionSpatialPolygons()を用いて, 結合したいポリゴンのIDを同じにする.

library(maptools)
spd3 <- unionSpatialPolygons(spd,IDs=c(1,1,1))
plot(spd3)

plot of chunk unnamed-chunk-8

同じ属性を含む場合に異なるSpatialPolygonsDataFrameのポリゴンを結合する場合は,spRbind()を用いる.

spd4 <- spRbind(spd1,spd2)
plot(spd4)

plot of chunk unnamed-chunk-9